interface StorageData<T = any> {
  data: T
  expire?: number
}

/**
 * 本地存储工具类
 */
class Storage {
  /**
   * 设置存储
   * @param key 存储键
   * @param value 存储值
   * @param expire 过期时间(单位：小时)，不传则永久有效
   */
  set<T>(key: string, value: T, expire?: number): void {
    const storageData: StorageData<T> = {
      data: value,
      expire: expire ? new Date().getTime() + expire * 60 * 60 * 1000 : undefined,
    }
    uni.setStorageSync(key, JSON.stringify(storageData))
  }

  /**
   * 获取存储
   * @param key 存储键
   * @returns 存储值，如果过期或不存在则返回null
   */
  get<T>(key: string): T | null {
    try {
      const storage = uni.getStorageSync(key)
      if (!storage)
        return null

      const storageData: StorageData<T> = JSON.parse(storage)

      // 判断是否过期
      if (storageData.expire && storageData.expire < new Date().getTime()) {
        this.remove(key)
        return null
      }

      return storageData.data
    }
    catch (error) {
      console.error(`Storage get error: ${error}`)
      return null
    }
  }

  /**
   * 移除存储
   * @param key 存储键
   */
  remove(key: string): void {
    uni.removeStorageSync(key)
  }

  /**
   * 清空所有存储
   */
  clear(): void {
    uni.clearStorageSync()
  }

  /**
   * 获取所有存储键
   * @returns 存储键数组
   */
  keys(): string[] {
    return uni.getStorageInfoSync().keys
  }
}

// 导出单例
export const storage = new Storage()
